class CreateAuth< ActiveRecord::Migration

  def self.up
    
    create_table :users do |t|
      t.column :name, :string
      t.column :email, :string
      t.column :status, :boolean
      t.column :password, :string, :limit => 40
      t.column :salt, :string
    end

    create_table :groups do |t|
      t.column :name, :string
    end

    create_table :capabilites do |t|
       t.column :acronym, :string, :limit => 5  
       t.column :name, :string
    end
    
    create_table :roles do |t|
      t.column :name, :string
    end
    
    create_table :groups_users, :id => false do |t|
      t.column :group_id, :integer
      t.column :user_id, :integer
    end

    create_table :capabilites_roles, :id => false do |t|
      t.column :role_id, :integer
      t.column :capabilite_id, :integer
    end

    create_table :groups_roles, :id => false do |t|
      t.column :group_id, :integer
      t.column :role_id, :integer
    end
    
    # Adicinando estrutura de autenticação para o Administrador
    # Criando o usuáriod e adiminsitração
    user = User.new(:name => "Admin", :email => "admin@tracksuite.com.br", :status => true, :pass => "admin", :pass_confirmation => "admin")
    user.save()

    # Criando o grupo de Administração
    group = Group.new(:name => "Admin")
    group.save()
    
    # Criando a capabilite de ADM:ALL
    capabilite = Capabilite.new(:acronym => "ADM", :name => "ALL")
    capabilite.save()
  
     # Criando a regra de Administração
    role = Role.new(:name => "Admin")
    role.save()
    
    # Associando o usuário de administração com grupo de administração
    group.users << user
    group.save()    
    
    # Associando a regra de administração com a capabilite de administração
    role.capabilites << capabilite
    role.save()    
    
    # Associando o grupo de administração com a regra de administração
    group.roles << role
    group.save();
    
    #---------------------------------------------------------------------#
    # Adicinando estrutura de autenticação para o Authentication
    #---------------------------------------------------------------------#
    # Criando o grupo de Administração
    group = Group.new(:name => "Authentication")
    group.save()
    
    # Criando a capabilite de ADM:ALL
    all = Capabilite.new(:acronym => "AUTH", :name => "ALL")
    all.save()
    Capabilite.new(:acronym => "AUTH", :name => "ADD").save()
    Capabilite.new(:acronym => "AUTH", :name => "REMOVE").save()
    Capabilite.new(:acronym => "AUTH", :name => "MODIFY").save()
    Capabilite.new(:acronym => "AUTH", :name => "VIEW").save()

     # Criando a regra de Administração e associando Capacidades
    role = Role.new(:name => "Authentication")
    role.capabilites.push(all)
    role.save()
    
    # Associando o grupo de administração com a regra de administração
    group.roles << role
    group.save();
   
  end

  def self.down
    drop_table :groups_roles
    drop_table :capabilites_roles
    drop_table :groups_users
    drop_table :roles
    drop_table :capabilites
    drop_table :groups
    drop_table :users
  end
  
end
